package com.huangfu.learning.javabase.java.pattern.structure.proxy;

/**
 * Created with IntelliJ IDEA.
 * Author: huangfu.daohui
 * Date: 2018/7/20
 * Time: 15:06
 * Version: 1.0
 * Description:静态代理模式：目标类和代理类要继承同一个接口
 * 优点：可以在不修改目标类的情况下，扩展目标类：增加before、after方法等
 * 缺点：目标类和代理类要实现共同的接口，目标类增加，代理类也增加，代码冗余。一旦接口增加方法，两边都要维护
 **/
public class StaticProxyPractice {
    // 测试
    public static void main(String[] args) {
        //目标对象
        TargetUserDaoStatic targetUserDao = new TargetUserDaoStatic();

        //代理对象,把目标对象传给代理对象,建立代理关系
        ProxyUserDao proxyUserDao = new ProxyUserDao(targetUserDao);
        //执行的是代理的方法
        proxyUserDao.save();
    }
}

//接口
interface IUserDaoStatic {
    void save();
}

//目标类
class TargetUserDaoStatic implements IUserDaoStatic {

    @Override
    public void save() {
        System.out.println("静态代理目标类TargetUserDao.save()保存数据成功！");
    }
}

//静态代理类
class ProxyUserDao implements IUserDaoStatic {

    //接收保存目标对象
    private IUserDaoStatic target;

    public ProxyUserDao(IUserDaoStatic target) {
        this.target = target;
    }

    @Override
    public void save() {
        System.out.println("save之前的操作（开始事务、权限等）...");
        target.save();
        System.out.println("save之后的操作（提交事务、日志等）...");
    }
}